/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.smarttmt.idu.web.beans;

import com.smarttmt.idu.web.behavior.Preloadable;
import com.smarttmt.idu.web.model.UserLogin;
import com.smarttmt.idu.web.persistence.controller.UsuacontJpaController;
import com.smarttmt.idu.web.persistence.controller.VwEstadocuentaValorizaJpaController;
import com.smarttmt.idu.web.persistence.entity.Uscochip;
import com.smarttmt.idu.web.persistence.entity.Usuacont;
import com.smarttmt.idu.web.utilities.FacesUtils;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.UserTransaction;

/**
 *
 * @author Nicolás Rubén Caballero Ortega (helaman58@gmail.com)
 */
@Named(value = "validatePINBean")
@SessionScoped
public class ValidatePIN extends SmartIduBackingBean implements Serializable, Preloadable {

    private String chipnumber;
    private VwEstadocuentaValorizaJpaController vwEstadocuentaValorizaJpaController;
    private UsuacontJpaController usuacontJpaController;
    @PersistenceUnit(unitName = "smarttmtiduappPU")
    EntityManagerFactory emf;
    @Resource
    UserTransaction utx;

    /**
     * Creates a new instance of ValidatePIN
     */
    public ValidatePIN() {
        super();
    }

    @PostConstruct
    public void initPostConstructorValidatePIN() {
        vwEstadocuentaValorizaJpaController = new VwEstadocuentaValorizaJpaController(utx, emf);
        usuacontJpaController = new UsuacontJpaController(utx, emf);
    }

    public void resetData() {
        this.chipnumber = null;
    }

    @Override
    public void preload(Map<String, Object> parameters) throws Exception {
        resetData();
    }

    public boolean validateChipRegisteredYet() {
        //Aqui se desarrolla la lógica que permite verificar si dado un CHIP,
        //ya se encuentra registrado, esto con la finalidad de ir directamente
        //al estado de cuenta y a las operaciones del sistema.
        UserLogin userLogin;
        if (getUserLoginBean().getUsername() != null) {
            userLogin = getUserLoginBean();
        } else {
            userLogin = (UserLogin) FacesUtils.getManagedBean("userLoginBean");
        }
        Usuacont usuacont = usuacontJpaController.getUserByUsconomb(userLogin.getUsername());
        java.util.List<Uscochip> listuscochip = usuacont.getUscochipList();
        System.out.println(listuscochip.size());
        java.util.Iterator<Uscochip> it = listuscochip.iterator();
        Uscochip uscochip;
        while (it.hasNext()) {
            uscochip = it.next();
            if (chipnumber.toUpperCase().trim().equalsIgnoreCase(uscochip.getUscochipPK().getUcchcodi().toString().toUpperCase().trim())) {
                return true;
            }
        }
        return false;
    }

    public String validateChip() {
        chipnumber = chipnumber.toUpperCase();

        //Con el número de chip, se valida que se encuentre entre los CHIPS asociados del usuario
        if (validateChipRegisteredYet()) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "El chip ya se ha validado anteriormente", "Ya se encuentra registrado"));
                return null;
        } 

        //Método en el cual se implementa la lógica para validación de CHIP.
        if (validateChipFormat() && validateCHIP() && validaPropietarioChip()) {
            try {
                //rutina para adicionar el parametro chipnumber validado
                Preloadable bean = (Preloadable) FacesUtils.getManagedBean("inmobRegistryValidatorBean");
                java.util.Map<String, Object> parameters = new HashMap<>();
                parameters.put("chipNumber", chipnumber);
                bean.preload(parameters);
                return "inmobRegistryValidator";
            } catch (Exception e) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrio un error mientras procesabamos su solicitud", "El sistema ha interrumpido el proceso..."));
                return null;
            }
        } else {
            if(!validateChipFormat()){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "El formato de Chip es incorrecto", "Rectificar numero chip..."));
            }
            if(!validateCHIP()){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Chip incorrecto", "Rectificar numero chip..."));
            }
            if(!validaPropietarioChip()){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ud no puede registrar este CHIP", "No es propietario..."));
            }
            return null;
        }
    }
    
    public boolean validaPropietarioChip(){
        UserLogin bean = (UserLogin) FacesUtils.getManagedBean("userLoginBean");
        Usuacont usuacont = usuacontJpaController.getUserByUsconomb(bean.getUsername());
        return vwEstadocuentaValorizaJpaController.validaPropietarioCHIP(chipnumber, usuacont.getUscodoid()).equals("S");
    }

    public boolean validateCHIP() {
        return vwEstadocuentaValorizaJpaController.validaCHIP(chipnumber).toUpperCase().equals("S");
    }

    public boolean validateChipFormat() {
        //Se aplican las condicioes de formato para validar el numero de CHIP.
        return true;
    }

    public String getChipnumber() {
        return chipnumber;
    }

    public void setChipnumber(String chipnumber) {
        this.chipnumber = chipnumber;
    }

    public VwEstadocuentaValorizaJpaController getVwEstadocuentaValorizaJpaController() {
        return vwEstadocuentaValorizaJpaController;
    }

    public void setVwEstadocuentaValorizaJpaController(VwEstadocuentaValorizaJpaController vwEstadocuentaValorizaJpaController) {
        this.vwEstadocuentaValorizaJpaController = vwEstadocuentaValorizaJpaController;
    }

    public EntityManagerFactory getEmf() {
        return emf;
    }

    public void setEmf(EntityManagerFactory emf) {
        this.emf = emf;
    }

    public UserTransaction getUtx() {
        return utx;
    }

    public void setUtx(UserTransaction utx) {
        this.utx = utx;
    }

    public UsuacontJpaController getUsuacontJpaController() {
        return usuacontJpaController;
    }

    public void setUsuacontJpaController(UsuacontJpaController UsuacontJpaController) {
        this.usuacontJpaController = UsuacontJpaController;
    }

}
